package com.qjdchina.sku.biz.impl;

import java.util.*;

import com.alibaba.fastjson.JSON;
import com.qjdchina.sku.enums.ItemValueType;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.qjdchina.commons.result.Result;
import com.qjdchina.sku.biz.SkuItemManager;
import com.qjdchina.sku.converter.SkuItemAttributeConverter;
import com.qjdchina.sku.converter.SkuItemConverter;
import com.qjdchina.sku.dao.mapper.SkuItemAttributeMapper;
import com.qjdchina.sku.dao.mapper.SkuItemMapper;
import com.qjdchina.sku.enums.IsRequired;
import com.qjdchina.sku.model.SkuItem;
import com.qjdchina.sku.model.SkuItemAttribute;
import com.qjdchina.sku.model.vo.SkuItemAttributeVO;
import com.qjdchina.sku.model.vo.SkuItemBasicVO;
import com.qjdchina.sku.model.vo.SkuItemVO;
import com.qjdchina.sku.service.enums.SkuResultCode;

@Service
public class SkuItemManagerImpl implements SkuItemManager {
	@Autowired
	private SkuItemMapper skuItemMapper;
	@Autowired
	private SkuItemAttributeMapper skuItemAttributeMapper;

	/**
	 * 根据品类获取sku shenpingfeng 2016年11月23日
	 * 
	 * @param categoryId
	 * @return
	 */
	@Override
	public Result<Map<String, Object>> getSkuByCategoryId(Integer categoryId) {
		if (categoryId == null) {
			return new Result<Map<String, Object>>(SkuResultCode.PARAMETER_NOT_EMPTY);
		}

		Map<String, Object> resultMap = new HashMap<>();
		// 获取skuItem
		List<SkuItem> skuItems = skuItemMapper.selectByCategoryId(categoryId);
		List<Integer> selectItemIds = new LinkedList<>();
		List<Integer> optionItemIds = new LinkedList<>();
		Map<Integer, String> optionItemNameMap = new HashMap<>();
		if (skuItems != null && skuItems.size() > 0) {
			for (SkuItem skuItem : skuItems) {
				if (ItemValueType.RADIO.getValue().equals(skuItem.getValueType())) {
					selectItemIds.add(skuItem.getId());
				} else if (ItemValueType.MUILT_SELCT.getValue().equals(skuItem.getValueType())) {
					optionItemIds.add(skuItem.getId());
					optionItemNameMap.put(skuItem.getId(), skuItem.getSkuName());
				}
			}
		}

		Map<Integer, List<SkuItemAttribute>> attributesMap = getAttributesMap(selectItemIds, false);
		Map<Integer, List<SkuItemAttribute>> optionMap = getAttributesMap(optionItemIds,true);
		// 合并
		if (skuItems == null || skuItems.size() == 0) {
			return new Result<Map<String, Object>>(SkuResultCode.DATA_NOT_EXIST);
		}
		List<SkuItemBasicVO> skuItemBasicVOs = new ArrayList<SkuItemBasicVO>();
		List<SkuItemBasicVO> skuItemNotOptionVOs = new ArrayList<SkuItemBasicVO>();
		for (SkuItem skuItem : skuItems) {
			SkuItemBasicVO skuItemBasicVO = new SkuItemBasicVO();
			SkuItemVO skuItemVO = SkuItemConverter.toSkuItemVO(skuItem);
			skuItemBasicVO.setSkuItemVO(skuItemVO);
			Integer id = skuItem.getId();
			List<SkuItemAttributeVO> skuItemAttributeVOs = new ArrayList<SkuItemAttributeVO>();
			List<SkuItemAttribute> skuItemAttributeList = attributesMap.get(id);
			if (skuItemAttributeList != null && skuItemAttributeList.size() > 0) {
				for (SkuItemAttribute skuItemAttribute : skuItemAttributeList) {
					SkuItemAttributeVO skuItemAttributeVO = SkuItemAttributeConverter
							.toSkuItemAttributeVO(skuItemAttribute);
					skuItemAttributeVOs.add(skuItemAttributeVO);
					skuItemBasicVO.setSkuItemAttributeVOs(skuItemAttributeVOs);
				}
			}
			if (!ItemValueType.HIDDEN.getValue().equals(skuItem.getValueType())) {
				skuItemBasicVOs.add(skuItemBasicVO);
			}
			if (!ItemValueType.MUILT_SELCT.getValue().equals(skuItem.getValueType()) && !"4".equals(skuItem.getValueType())) {
				skuItemNotOptionVOs.add(skuItemBasicVO);
			}
		}
		resultMap.put("skuItemBasicVOs", skuItemBasicVOs);
		resultMap.put("skuItemNotOptionVOs", skuItemNotOptionVOs);

		Map<String, List<SkuItemAttribute>> optionItemMap = new HashMap<>();
		for (Integer key : optionItemNameMap.keySet()) {
			optionItemMap.put(optionItemNameMap.get(key), optionMap.get(key));
		}
		resultMap.put("optionItemMap", optionItemMap);

		return new Result<Map<String, Object>>(resultMap);
	}

	private Map<Integer, List<SkuItemAttribute>> getAttributesMap(List<Integer> itemIds, Boolean isOption){
		Map<Integer, List<SkuItemAttribute>> attributesMap = new LinkedHashMap<>();
		if (itemIds.size() > 0) {
			// 根据下拉的skuItemAttribute
			List<SkuItemAttribute> skuItemAttributes = skuItemAttributeMapper.selectBySkuItemIds(itemIds);
			for (SkuItemAttribute skuItemAttribute : skuItemAttributes) {
				if(isOption){
					Map<String,Object> valueMap = (Map<String,Object>)JSON.parse(skuItemAttribute.getValue());
					skuItemAttribute.setValue((String)valueMap.get("name"));
				}
				List<SkuItemAttribute> skuItemAttributeList;
				if (attributesMap.containsKey(skuItemAttribute.getSkuItemId())) {
					skuItemAttributeList = attributesMap.get(skuItemAttribute.getSkuItemId());
				} else {
					skuItemAttributeList = new LinkedList<>();
				}
				skuItemAttributeList.add(skuItemAttribute);
				attributesMap.put(skuItemAttribute.getSkuItemId(), skuItemAttributeList);
			}
		}
		return attributesMap;
	}

	/**
	 * 根据skuItemId查询 shenpingfeng 2016年12月7日
	 * 
	 * @param skuItemId
	 * @return
	 */
	@Override
	public Result<List<SkuItemAttribute>> getSkuItemAttributeBySkuItemId(Integer skuItemId) {
		if (skuItemId == null) {
			return new Result<List<SkuItemAttribute>>(SkuResultCode.PARAMETER_NOT_EMPTY);
		}

		List<SkuItemAttribute> skuItemAttributes = skuItemAttributeMapper.selectBySkuItemId(skuItemId);
		if (skuItemAttributes == null || skuItemAttributes.size() == 0) {
			return new Result<List<SkuItemAttribute>>(SkuResultCode.DATA_NOT_EXIST);
		}

		return new Result<List<SkuItemAttribute>>(skuItemAttributes);
	}

	/**
	 * 创建表头 shenpingfeng 2017年2月14日
	 * 
	 * @param skuItemVO
	 * @return
	 */
	@Override
	public Result<String> create(SkuItemVO skuItemVO) {
		if (skuItemVO == null || skuItemVO.getSkuCategoryId() == null || StringUtils.isBlank(skuItemVO.getSkuName())) {
			return new Result<String>(SkuResultCode.PARAMETER_NOT_EMPTY);
		}
		// 检验表头是否存在
		SkuItem item = skuItemMapper.selectByCategoryIdAndSkuName(skuItemVO.getSkuCategoryId(), skuItemVO.getSkuName());
		if (item != null) {
			return new Result<String>(SkuResultCode.ADD_FAIL);
		}
		SkuItem skuItem = SkuItemConverter.toSkuItem(skuItemVO);
		skuItem.setCode(UUID.randomUUID().toString());
		skuItem.setIsRequired(IsRequired.YES.getValue());
		skuItem.setTitle(skuItem.getSkuName());
		skuItem.setSkuGroupId(1);
		int row = skuItemMapper.insertSelective(skuItem);
		if (row == 0) {
			return new Result<String>(SkuResultCode.ADD_FAIL);
		}

		return new Result<String>(skuItem.getCode());
	}

	/**
	 * 更新表头 shenpingfeng 2017年2月14日
	 * 
	 * @param skuItemVO
	 * @return
	 */
	@Override
	public Result<String> update(SkuItemVO skuItemVO) {
		if (skuItemVO == null || skuItemVO.getId() == null) {
			return new Result<String>(SkuResultCode.PARAMETER_NOT_EMPTY);
		}
		if (skuItemVO.getValueType().equals("1")) {
			// 判断是否有属性值，如果有，更新失败
			List<SkuItemAttribute> skuItemAttributes = skuItemAttributeMapper.selectBySkuItemId(skuItemVO.getId());
			if (skuItemAttributes != null && skuItemAttributes.size() > 0) {
				// 有关联的属性,不能删除
				return new Result<String>(SkuResultCode.SKU_ITEM_ATTRIBUTE_EXIST);
			}
		}
		SkuItem skuItem = SkuItemConverter.toSkuItem(skuItemVO);
		skuItem.setTitle(skuItem.getSkuName());
		int row = skuItemMapper.updateByPrimaryKeySelective(skuItem);
		if (row == 0) {
			return new Result<String>(SkuResultCode.UPDATE_FAIL);
		}

		return new Result<String>(skuItem.getDescription());
	}

	/**
	 * 根据code获取 shenpingfeng 2017年2月21日
	 * 
	 * @param code
	 * @return
	 */
	@Override
	public Result<SkuItemVO> getSkuItemByCode(String code) {
		if (StringUtils.isBlank(code)) {
			return new Result<SkuItemVO>(SkuResultCode.PARAMETER_NOT_EMPTY);
		}
		SkuItem skuItem = skuItemMapper.selectSkuItemByCode(code);
		if (skuItem == null) {
			return new Result<SkuItemVO>(SkuResultCode.DATA_NOT_EXIST);
		}
		SkuItemVO skuItemVO = SkuItemConverter.toSkuItemVO(skuItem);
		return new Result<SkuItemVO>(skuItemVO);
	}

	@Override
	public Result<List<String>> getOptionItemNumber(Integer itemId) {
		if (itemId == null) {
			return new Result<List<String>>(SkuResultCode.PARAMETER_NOT_EMPTY);
		}

		List<String> itemAttrNameList = new ArrayList<>();
		List<SkuItemAttribute> skuItemAttributeList = skuItemAttributeMapper.selectBySkuItemId(itemId);
		if (skuItemAttributeList != null && skuItemAttributeList.size() > 0) {
			for (SkuItemAttribute skuItemAttribute : skuItemAttributeList) {
				Map<String, Object> valueMap = (Map<String, Object>) JSON.parse(skuItemAttribute.getValue());
				Integer type = (Integer) valueMap.get("type");
				if (type == 1) {
					String name = (String) valueMap.get("name");
					itemAttrNameList.add(name);
				}
			}
		}

		return new Result<List<String>>(itemAttrNameList);
	}

	@Override
	public Result<List<SkuItem>> selectByCategoryIdAndSkuNameLike(Integer skuCategoryId, String skuName) {
		if (skuCategoryId == null && StringUtils.isBlank(skuName)) {
			return new Result<List<SkuItem>>(SkuResultCode.PARAMETER_NOT_EMPTY);
		}
		List<SkuItem> skuItemList = skuItemMapper.selectByCategoryIdAndSkuNameLike(skuCategoryId, skuName);

		return new Result<List<SkuItem>>(skuItemList);
	}

	@Override
	public Result<Integer> getStrategicSkuItemId(Integer skuCategoryId) {
		if (skuCategoryId == null) {
			return new Result<Integer>(SkuResultCode.PARAMETER_NOT_EMPTY);
		}
		Integer strategicSkuItemId = null;
		List<SkuItem> skuItemList = skuItemMapper.selectByCategoryIdAndSkuNameLike(skuCategoryId, "战略");
		if (skuItemList.size() == 1) {
			strategicSkuItemId = skuItemList.get(0).getId();
		} else {
			for (SkuItem skuItem : skuItemList) {
				if (skuItem.getSkuName().contains("战略合作供货价")) {
					strategicSkuItemId = skuItem.getId();
				}
			}
		}

		return new Result<Integer>(strategicSkuItemId);
	}
}
